package com.zx.mobile.context;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 编写自定义标签的类
 * @author jeffery.lu
 * 20160506
 */
public class TokenHelperTag extends TagSupport {
	
	/**
	 * 凡序列化
	 */
	private static final long serialVersionUID = -1815168785364991254L;

	@Override
	public int doStartTag() throws JspException {
		/***
		 * 拦截器的两种原理
		 * 1：服务端生成一个唯一标示符 UUID并保持到session中 ，同时吧这个UUID也带到客户端页面，然后页面提交，
		 * 判断客户端页面中UUID和服务器端的UUID进行匹配，匹配成功表明是非重复提交，否则视为重复提交
		 * 
		 * 2：服务端生成一个唯一标示符 UUID(不存入session，只是用于客户端的存储) ，把这个UUID也带到客户端页面，然后页面提交，
		 * 如果服务器的token为null，把客户端页面中UUID存入session中的token中,并允许提交，
		 * 在整个流程结束后，把该token值从session移除(在SpringMVCInterceptor->afterCompletion方法中移除)
		 */
		
		/*** 第一种原理实现方式  **/
		//得到uuid
		String uuid=UUID.randomUUID().toString().replace("-","");
		Map<String,String> tokenMap = (Map<String, String>) pageContext.getSession().getAttribute("tokenMap") ;
		if(tokenMap == null || tokenMap.size() == 0 ){
			tokenMap = new HashMap<String,String>();
		}
		tokenMap.put(uuid, uuid);
		//得到session,pageContext 是域对象同样也是工具类
		pageContext.getSession().setAttribute("tokenMap",tokenMap);
		String html="<input type='hidden' id='tokenName' name='tokenName' readonly='readonly' value="+uuid+">";
		try {
			pageContext.getOut().print(html);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return EVAL_BODY_INCLUDE;

	}

}
